﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Jurassic_Island;
using System.Web.Security;
using System.Data;

namespace JurassicIslandWeb
{
    public partial class Desplazamiento : System.Web.UI.Page
    {
        private const int Dificultad = 100;
        private const String htmlCorazon = "<img src=\"Images/corazon.gif\" align=\"absmiddle\" style=\"height:20px;\" />";
        private const String htmlMoneda = "<img src=\"Images/coin.gif\" align=\"absmiddle\" style=\"height:20px;\" />";
        private const String htmlCalavera = "<img src=\"Images/skull.gif\" align=\"absmiddle\" style=\"height:20px;\" />";

        private String LeerParametro(String NombreParametro, String ValorPorDefecto = "")
        {
            String respuesta = ValorPorDefecto;
            try
            {
                respuesta = Request.QueryString.Get(NombreParametro);
                if (respuesta.Equals(""))
                    throw new Exception();
            }
            catch (Exception)
            {
                respuesta = ValorPorDefecto;
            }

            return respuesta;
        }

        private bool PermitirDesplazamiento(String origen, String destino)
        {
            bool salida = false;
            ENCaminos enCam = new ENCaminos();
            DataSet dsCaminos = enCam.ObtenerListaCaminosPorOrigenDestino(origen, destino);
            if (dsCaminos.Tables["Caminos"].Rows.Count > 0)
            {
                enCam = new ENCaminos(dsCaminos.Tables["Caminos"].Rows[0]);
                if (enCam.Origen.ToLower().Equals(origen.ToLower()) && enCam.Destino.ToLower().Equals(destino.ToLower()))
                    salida = true;
            }

            return salida;
        }

        private void EscribirEnLog(String Texto,bool SaltoDeLinea = false)
        {
            LabelLog.Text += Texto;
            if (SaltoDeLinea)
                LabelLog.Text += "<br />";
        }

        private ENEventosAleatorios ElegirEventoAleatorio()
        {
            ENEventosAleatorios enEvAleat = new ENEventosAleatorios();
            DataSet dsEvAleat = enEvAleat.ObtenerListaEventosAleatorios();
            int nEventos = dsEvAleat.Tables["Eventos_Aleatorios"].Rows.Count;
            Random dado = new Random();
            enEvAleat = new ENEventosAleatorios(dsEvAleat.Tables["Eventos_Aleatorios"].Rows[dado.Next(nEventos)]);
            return enEvAleat;
        }

        private ENEventosLocalizacion ElegirEventoLocalizacion(String nomLugar)
        {
            ENEventosLocalizacion enEvLoc = new ENEventosLocalizacion();
            DataSet dsEvLoc = enEvLoc.ObtenerListaEventosLocalizacionPorLugar(nomLugar);
            int nEventos = dsEvLoc.Tables["Eventos_Localizacion"].Rows.Count;
            Random dado = new Random();
            enEvLoc = new ENEventosLocalizacion(dsEvLoc.Tables["Eventos_Localizacion"].Rows[dado.Next(nEventos)]);
            return enEvLoc;
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!User.Identity.IsAuthenticated)
            {
                Response.Redirect("~/Bienvenida.aspx");
            }
            else
            {
                ENJugadores enJugAux = new ENJugadores();
                try
                {

                    enJugAux = enJugAux.ObtenerJugador(User.Identity.Name); //Comprobamos que el jugador todavía existe
                }
                catch (Exception)
                {   //Llegaremos aquí si no existiera el jugador en la base de datos.
                    FormsAuthentication.SignOut(); //Se cierra la sesión para borrar la cookie.
                    Response.Redirect("~/Bienvenida.aspx"); //Se le redirige a la pagina de bienvenida
                }

                try
                {
                    //Obtener datos de partida
                    ENPartidas enPart = new ENPartidas();
                    DataSet dsPart = enPart.ObtenerListaPartidasPorJugador(enJugAux.Jugador);
                    enPart = new ENPartidas(dsPart.Tables["Partidas"].Rows[0]);
                    
                    if (enPart.Vida > 0)
                    {
                        //Obtener datos de Lugar de origen
                        ENLugares enLugOrig = new ENLugares();
                        DataSet dsLug = enLugOrig.ObtenerListaLugares();
                        enLugOrig = new ENLugares(dsLug.Tables["Lugares"].Rows.Find(enPart.Lugar));

                        String strDestino = LeerParametro("destino", enLugOrig.Nombre);

                        //EscribirEnLog(Server.UrlEncode("montaña"), true);

                        EscribirEnLog("Comenzaste a caminar desde '" + enLugOrig.Nombre + "'.", true);



                        if (PermitirDesplazamiento(enPart.Lugar, strDestino))
                        {
                            ENCaminos enCam = new ENCaminos();
                            DataSet dsCam = enCam.ObtenerListaCaminosPorOrigenDestino(enPart.Lugar, strDestino);
                            enCam = new ENCaminos(dsCam.Tables["Caminos"].Rows[0]);

                            bool sanoysalvo = true;
                            ENPartidas enPartMod = new ENPartidas(enPart);
                            ENLugares enLugDest = new ENLugares(dsLug.Tables["Lugares"].Rows.Find(strDestino));
                            enPartMod.Lugar = enLugDest.Nombre;

                            //Creamos el dado
                            Random dado = new Random();

                            //Realizamos tirada de dado para penalizar/bonificar por el coste del viaje
                            int tirada = dado.Next(Dificultad);
                            if (tirada > enCam.Coste) //Tirada superior. Regalamos dinero!!
                            {
                                enPartMod.Dinero += (tirada - enCam.Coste);
                                EscribirEnLog("¡Ganaste " + (tirada - enCam.Coste) + " monedas " + htmlMoneda + "!", true);
                            }
                            else if (tirada < enCam.Coste) //Tirada mala. Quitamos vida...
                            {
                                enPartMod.Vida -= (enCam.Coste - tirada);
                                sanoysalvo = false;
                                EscribirEnLog("¡Perdiste " + (enCam.Coste - tirada) + " puntos de vida " + htmlCorazon + "!", true);
                            }

                            //Realizamos una segunda tirada para echar a suertes si toca un Evento aleatorio en este viaje
                            tirada = dado.Next(4);
                            if (tirada > 2)
                            {
                                try
                                {
                                    ENEventosAleatorios enEvAleat = ElegirEventoAleatorio();
                                    EscribirEnLog("EVENTO: " + enEvAleat.Nombre_evaleat, false);
                                    enPartMod.Vida += int.Parse(enEvAleat.Efecto_evaleat.ToString());
                                    if (enEvAleat.Efecto_evaleat > 0)
                                    {
                                        EscribirEnLog(" (ganas " + enEvAleat.Efecto_evaleat + " puntos de vida " + htmlCorazon + ").", true);
                                    }
                                    else if (enEvAleat.Efecto_evaleat < 0)
                                    {
                                        sanoysalvo = false;
                                        EscribirEnLog(" (pierdes " + enEvAleat.Efecto_evaleat + " puntos de vida " + htmlCorazon + ").", true);
                                    }
                                    else
                                    {
                                        EscribirEnLog(".", true);
                                    }
                                }
                                catch (Exception)
                                {
                                }
                            }

                            if (sanoysalvo) // Si se llegó al destino sin perder vida
                                EscribirEnLog("Llegaste sano y salvo a '" + enLugDest.Nombre + "'.", true);
                            else
                                EscribirEnLog("Llegaste a '" + enLugDest.Nombre + "'.", true);

                            //Una tirada de dado más para echar a suertes si toca un Evento de Localizacion en este lugar
                            tirada = dado.Next(4);
                            if (tirada > 2)
                            {
                                try
                                {
                                    ENEventosLocalizacion enEvLoc = ElegirEventoLocalizacion(enLugDest.Nombre);
                                    EscribirEnLog("Al llegar a '" + enLugDest.Nombre + "': " + enEvLoc.Nombre_evloc, false);
                                    enPartMod.Vida += int.Parse(enEvLoc.Efecto_evloc.ToString());
                                    if (enEvLoc.Efecto_evloc > 0)
                                    {
                                        EscribirEnLog(" (ganas " + enEvLoc.Efecto_evloc + " puntos de vida " + htmlCorazon + ").", true);
                                    }
                                    else if (enEvLoc.Efecto_evloc < 0)
                                    {
                                        sanoysalvo = false;
                                        EscribirEnLog(" (pierdes " + enEvLoc.Efecto_evloc + " puntos de vida " + htmlCorazon + ").", true);
                                    }
                                    else
                                    {
                                        EscribirEnLog(".", true);
                                    }
                                }
                                catch (Exception)
                                {
                                }
                            }

                            if (enPartMod.Vida <= 0)
                            {
                                EscribirEnLog(htmlCalavera + " Se te agotó la vida. <b>Fin del Juego</b>" + htmlCalavera, true);
                            }

                            if (!enPartMod.Equals(enPart))
                            {
                                enPartMod.GuardarPartida();
                            }

                        }
                        else
                        {
                            EscribirEnLog("...pero te desorientaste y caminaste en circulos hasta que volviste a '" + enLugOrig.Nombre + "'.", false);
                            //Mensaje de vuelta al lugar de origen
                        }
                    }
                    else
                    {
                        EscribirEnLog(htmlCalavera + " Se te agotó la vida. <b>Fin del Juego</b>" + htmlCalavera, true);
                    }
                }
                catch (Exception ex)
                {
                    EscribirEnLog("ERROR: "+ex.Message + " /// " + ex.StackTrace , false);
                }

            }
        }
    }
}